package com.charlotte.study.gupao.singleton.lazy;

/**
 * 静态内部类实现单例模式
 * 原理：静态内部类会在类使用时再进行加载
 * 优点：
 *      1. 线程安全
 *      2. 节省资源空间
 *      3. 性能好
 *      4. 无法被反射破坏
 * 缺点：
 *      1. 代码抛出异常，不优雅
 * @author junjie.ding
 * @date 2020/2/27
 */
public class LazyInnerClassSingletonDemo {


    private LazyInnerClassSingletonDemo() {
        // 增加判断条件，防止反射破坏
        if(LazyHolder.INSTANCE != null){
            throw new RuntimeException("不允许创建多个实例！");
        }
    }

    // 关键字作用： static是为了是单例空间共享，final是为了防止方法被重写、重载
    public final static LazyInnerClassSingletonDemo getInstance(){
        // 在返回前，一定会先加载内部类
        return LazyHolder.INSTANCE;
    }


    // 默认不加载
    private static class LazyHolder{
        private static final LazyInnerClassSingletonDemo INSTANCE = new LazyInnerClassSingletonDemo();
    }

}
